home *** CD-ROM | disk | FTP | other *** search
- {
- > 640/480/16 mode... Yes I know how to put a pixel with the
- > What I want is Line, Bitmap procedure...
-
- The first is mine, the second a bit.
- }
-
- procedure FillBox(X1,Y1,X2,Y2:word; Color:byte); assembler;
- { Fill (X1,Y1)-(X2,Y1) with Color, VGA only, 640 lines, 16 color mode, PD }
- asm
- cld
- mov dx,3ceh
- mov ah,Color
- mov al,0
- out dx,ax
- mov ax,0305h
- out dx,ax
- mov ax,0a000h
- mov es,ax
- mov ax,Y1
- mov si,Y2
- sub si,ax
- jz @NoLines
- {$ifopt G+}shl ax,6{$else}mov cl,6;shl ax,cl{$endif}
- mov di,ax
- {$ifopt G+}shr ax,2{$else}shr ax,1; shr ax,1{$endif}
- add di,ax
- mov ax,X1
- mov cl,al
- {$ifdef G+}shr ax,3{$else}shr ax,1; shr ax,1; shr ax,1{$endif}
- mov bx,X2
- mov ch,bl
- {$ifdef G+}shr bx,3{$else}shr bx,1; shr bx,1; shr bx,1{$endif}
- sub bx,ax
- push bp
- mov bp,bx
- add di,ax
- and cx,707h
- mov bx,0ffffh
- shr bl,cl
- mov cl,ch
- xor cl,7
- inc cx
- shl bh,cl
- or bp,bp
- jnz @NoDub
- and bl,bh
- jz @NoLines2
- @NoDub:
- mov al,8
- @PutLines:
- cli
- mov al,es:[di]
- mov es:[di],bl
- sti
- inc di
- mov cx,bp
- dec cx
- js @NoPBL
- jz @NoPB
- mov al,0ffh
- rep stosb
- @NoPB:
- cli
- mov al,es:[di]
- mov es:[di],bh
- sti
- inc di
- @NoPBL:
- sub di,bp
- add di,80-1
- dec si
- jnz @PutLines
- @NoLines2:
- pop bp
- @NoLines:
- mov ax,0005h
- out dx,ax
- end;
-
- procedure PixelAddrHGC; assembler;
- asm
- mov cl,bl
- {$ifopt G+}shr bx,3{$else}shr bx,1;shr bx,1;shr bx,1{$endif}
- {$ifopt G+}shl ax,6{$else}mov ch,cl; mov cl,6; shl ax,cl; mov cl,ch;{$endif}
- add bx,ax
- {$ifopt G+}shr ax,2{$else}shr ax,1; shr ax,1;{$endif}
- add bx,ax
- mov ax,0a000h
- mov es,ax
- and cl,7
- xor cl,7
- mov ah,1
- end;
-
- procedure Line(X1,Y1,X2,Y2:word; Color:byte); assembler;
- { Draw a line from (X1,Y1)-(X2,Y2) in Color, VGA only, 640 lines, 16 colors }
- { Originally from a HGC line routine in a book, converted to VGA by me }
- const
- ByteOffsetShift=3;
- var
- Incr1,Incr2:word;
- Routine:word;
- asm
- cld
- mov si,80
- mov dx,3ceh
- mov ah,Color
- xor al,al
- out dx,ax
- mov ax,0305h
- out dx,ax
- mov cx,X2
- sub cx,X1
- jz @VertLineHGC { Jump if X1=X2, VertLine }
- jns @Li01 { Jump if X2>X1, no swap }
- neg cx
- mov bx,X2
- xchg bx,X1
- mov X2,bx
- mov bx,Y2
- xchg bx,Y1
- mov Y2,bx
- @Li01: mov bx,Y2
- sub bx,Y1
- jnz @Li02 { Jump if Y1<>Y2, no HorizLine }
- jmp @HorizLineHGC
- @Li02: jns @Li03 { Jump if Y2 > Y1, no swap }
- neg bx
- neg si
- @Li03: mov routine,offset @LoSlopeLineHGC
- cmp bx,cx
- jle @Li04
- mov routine,offset @HiSlopeLineHGC
- xchg bx,cx
- @Li04: shl bx,1
- mov incr1,bx
- sub bx,cx
- mov di,bx
- sub bx,cx
- mov incr2,bx
- push cx
- mov ax,Y1
- mov bx,X1
- call PixelAddrHGC
- mov al,1
- shl ax,cl
- mov dx,ax
- not dh
- pop cx
- inc cx
- jmp routine { Var containing LoSlope/HiSlope }
-
- @VertLineHGC: mov ax,Y1
- mov bx,Y2
- mov cx,bx
- sub cx,ax
- jge @Li31
- neg cx
- mov ax,bx
- @Li31: inc cx
- mov bx,X1
- push cx
- call PixelAddrHGC
- mov al,1
- shl ax,cl
- not ah
- pop cx
- @Li32: mov ah,es:[bx]
- mov es:[bx],al
- add bx,si
- loop @Li32
- jmp @Liexit
-
- @HorizLineHGC:
- mov ax,Y1
- mov bx,X1
- call PixelAddrHGC
- mov di,bx
- mov dh,ah
- not dh
- mov dl,0ffh
- shl dh,cl
- not dh
- mov cx,X2
- and cl,7
- xor cl,7
- shl dl,cl
- mov ax,X2
- mov bx,X1
- mov cl,ByteOffsetShift
- shr ax,cl
- shr bx,cl
- mov cx,ax
- sub cx,bx
- mov ax,0ffffh
- or dh,dh
- js @Li43
- or cx,cx
- jnz @Li42
- and dl,dh
- jmp @Li44
- @Li42: mov ah,al
- and ah,dh
- mov bl,es:[di]
- mov es:[di],ah
- inc di
- dec cx
- @Li43: or cx,cx
- jz @Li44
- @InLoop: mov bl,es:[di]
- stosb
- loop @InLoop
- { if mode = NO_OP replace 'or cx,cx'-'loop @InLoop:' with 'rep stosb'}
- @Li44: and al,dl
- mov dl,es:[di]
- mov es:[di],al
- jmp @Liexit
-
- @LoSlopeLineHGC:
- @Li10: mov ah,es:[bx]
- xor ah,ah
- @Li11: or ah,dl
- ror dl,1
- ror dh,1
- jnc @Li14
- or di,di
- jns @Li12
- add di,incr1
- loop @Li11
- mov es:[bx],ah
- jmp @Liexit
- @Li12: add di,incr2
- mov es:[bx],ah
- add bx,si
- loop @Li10
- jmp @Liexit
- @Li14: mov es:[bx],ah
- inc bx
- or di,di
- jns @Li15
- add di,incr1
- loop @Li10
- jmp @Liexit
- @Li15: add di,incr2
- add bx,si
- loop @Li10
- jmp @Liexit
-
- @HiSlopeLineHGC:
- @Li21: mov al,es:[bx]
- mov es:[bx],dl
- add bx,si
- or di,di
- jns @Li23
- add di,incr1
- loop @Li21
- jmp @Liexit
- @Li23: add di,incr2
- ror dl,1
- ror dh,1
- cmc
- adc bx,0
- loop @Li21
- @Liexit:
- mov dx,3ceh
- mov ax,5
- out dx,ax
- end;